#include <iostream>
#include <cstdio>
#include <cstring>
#include <unistd.h>

int main()
{
    // 库函数
    // printf、fprintf、fwrite 属于标准 I/O 函数（库函数），它们默认使用缓冲机制：
    // 当输出到终端（屏幕）时，通常是 行缓冲（遇到换行符\n就刷新缓冲区）。
    // 当重定向到文件时，通常是 全缓冲（缓冲区满了才刷新，或程序结束时刷新）。
    printf("hello orintf\n");
    fprintf(stdout, "hello fprintf\n");
    const char *msg = "hello fwrite\n";
    fwrite(msg, strlen(msg), 1, stdout);

    // 系统调用
    // write 是系统调用，它直接写入内核缓冲区，没有标准 I/O 库的缓冲层，通常会更快输出。
    const char *sys_msg = "hello write\n";
    write(1, sys_msg, strlen(sys_msg));


    // 输出到屏幕时，行缓冲提前刷新了标准 I/O 的缓冲区，fork复制的是空缓冲区，所以只输出 4 行。
    // 重定向到文件时，全缓冲让标准 I/O 数据暂存于用户态缓冲区，
    // fork复制了这个 “有数据的缓冲区”，父、子进程结束时各自刷新，再加上write的直接输出，最终得到 7 行。
    fork();


    return 0;
}






//int main()
//{
//    // 向标准输出打印, stdout, cin -> 1
//    std::cout << "hello cout" << std::endl;
//    printf("hello printf\n");
//    
//    // 向标准错误打印, stderr, cerr -> 2, 显示器
//    std::cerr << "hello cerr" << std::endl;
//    fprintf(stderr, "helle stderr\n");
//
//    // 1>log.txt 2>&1 能合并输出的核心是：通过先修改 stdout 的目标，再让 stderr 复制 stdout 的目标，强制两个描述符指向同一个文件
//    // 简化写法 &>log.txt 是 bash 提供的语法糖
//    
//    return 0;
//}
